#include "pcpt_comm/pcpt_comm_file.h"

/**************************************************************************************
功能描述: 是否为文件
修改记录:
**************************************************************************************/
bool FILE_MNG_EX_C::IsFile(const char *filePath)
{
     struct stat buffer;
     return (stat(filePath, &buffer) == 0 && S_ISREG(buffer.st_mode));
}

/**************************************************************************************
功能描述: 是否为文件夹
修改记录:
**************************************************************************************/
bool FILE_MNG_EX_C::IsDirectory(const char *dirPath)
{
    struct stat buffer;
    return (stat(dirPath, &buffer) == 0 && S_ISDIR(buffer.st_mode));
}

/**************************************************************************************
功能描述: 删除文件或目录，成功返回0，失败返回-1
修改记录:
**************************************************************************************/ 
int FILE_MNG_EX_C::DeleteFile(const char *filePath)
{
    return remove(filePath);
}

/**************************************************************************************
功能描述: 检查目录是否存在，如果不存在，则创建
修改记录:
**************************************************************************************/
bool FILE_MNG_EX_C::IsDirExisted(string &dirPath)
{
    if (IsDirExist(dirPath.c_str())) {
        return true;
    } else if (0 == CreatDirectoryRecursive(dirPath)){
        return true;
    }

    return false;
}

/**************************************************************************************
功能描述: 检查目录是否存在
修改记录:
**************************************************************************************/
bool FILE_MNG_EX_C::IsDirExist(const char* dirPath)
{
    DIR *dp;
    if ((dp = opendir(dirPath)) == NULL) {
        return false;
    }
 
    closedir(dp);
    return true;
}

/**************************************************************************************
功能描述: 检查文件/文件夹(所有类型)是否存在
修改记录:
**************************************************************************************/
bool FILE_MNG_EX_C::IsFileExist(const char* filePath)
{
    if (0 == access(filePath, F_OK)) {
        return true; 
    } else {
        return false;
    }
}

/**************************************************************************************
功能描述: 创建目录，0:成功 -1:失败
修改记录:
**************************************************************************************/ 
int FILE_MNG_EX_C::CreatDirectory(const char* dirPath) // recursive递归
{
    int isCreate = mkdir(dirPath, S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO); //成功返回0
 
    if(!isCreate) {
        ST_LOG_INFO("create path:%s", dirPath);
        usleep(10 * 1000);
        return 0;
    } else {
        ST_LOG_ERR("create path failed! error code : %s", dirPath);
        return -1;
    }
}

/**************************************************************************************
功能描述: 递归创建目录，0:成功 -1:失败
修改记录:
**************************************************************************************/ 
int FILE_MNG_EX_C::CreatDirectoryRecursive(string &dirPath)
{
    if (0 != CheckDirPath(dirPath)) {
        return -1;
    }
    
    std::string::size_type len = dirPath.size();
    
    for (size_t i = 0; i < len; ++i) {
        std::string temp = dirPath.substr(0, i+1);

        if (('/' == dirPath[i] || i == len-1) && access(temp.c_str(), F_OK) != 0) {
            //S_IRWXU|S_IRWXG|S_IRWXO目录访问权限
            if (mkdir(temp.c_str(), S_IRWXU|S_IRWXG|S_IRWXO)) { 
                ST_LOG_ERR("create path failed! error code : %s", temp.c_str());
                return -1;
            }
        }
    }

    ST_LOG_INFO("create path:%s", dirPath.c_str());
    usleep(10 * 1000);
    return 0;
}

int FILE_MNG_EX_C::CheckDirPath(string &dirPath)
{
    if (dirPath.empty()) {
        ST_LOG_ERR("Path Empty, Error");
        return -1;
    }
    
    for (size_t i = 0; i < dirPath.size() - 2; ++i) {
        if (dirPath[i] == '/' && dirPath[i+1] == '/') {
            ST_LOG_ERR("%s Path Error.", dirPath.c_str());
            return -1;
        }
    }

    AddBackSlashAtEnd(dirPath);

    return 0;
}

/**************************************************************************************
功能描述: 在路径末尾添加反斜线"\"
修改记录:
**************************************************************************************/ 
void FILE_MNG_EX_C::AddBackSlashAtEnd(string &dirPath)
{
    if ('/' != dirPath.back()) {
        dirPath += "/";
    }
}
